﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using DataAccess;
using Entities;
using ATM.Utility.Constants;
namespace Bussiness
{
    public class ATMSystemBussiness : IATMSystemBussiness
    {
        #region Private members and Constructors

        private readonly CardDao _cardDao;
        
        public ATMSystemBussiness()
        {
            this._cardDao = new CardDao();
        }

        #endregion
       
        #region Hoatd1

        /// <summary>
        /// Reads the card.
        /// </summary>
        /// <param name="cardNumber">The card number.</param>
        /// <returns></returns>
        public Card ReadCard(Guid cardNumber)
        {
            return new Card();
        }

        /// <summary>
        /// Kiểm tra tài khoản có rút được tiền hay không
        /// </summary>
        /// <param name="account">The account.</param>
        /// <param name="amount">Số tiền muốn rút</param>
        /// <returns>True or False </returns>
        public bool CheckCheckingAccount(CheckingAccount checkAccount, float amount)
        {
            //Nếu Account null
            if (checkAccount == null)
                return false;
            //Xác thực tài khoản
            if (!this.Validate(checkAccount.CardID.ToString()))
                return false;
            //Nếu số tiền rút <= 0
            if (amount <= 0)
                return false;
            // Nếu số tiền rút > số tiền có trong tài khoản trừ đi số tiền phải duy trì trong tài khoản
            if (amount > (checkAccount.GetBalance() - checkAccount.ODLimit))
                return false;
            // Nếu tổng số tiền đã rút trong ngày > số tiền tối đa được rút trong ngày
            if ((amount + checkAccount.AmountWithrawOnDay()) > checkAccount.DayLimit)
                return false;
            // Nếu số tiền trong ATM ít hơn số tiền muốn rút
            if (amount >= AtmSystem.GetATMMoney())
                return false;
            return true;
        }
        #endregion

        #region HiepPV1
        
        /// <summary>
        /// DispenseMoney
        /// </summary>
        /// <param name="amount"></param>
        /// <returns></returns>
        public bool DispenseMoney(float amount)
        {
            return new MoneyDispenserBLL().DispenseMoney(amount);
        }

        /// <summary>
        /// Withdraw money
        /// </summary>
        /// <param name="amount"></param>
        /// <param name="account"></param>
        /// <returns></returns>
        public bool WithdrawMoney(float amount, CheckingAccount checkAccount, bool isPrintRecept)
        {
            var scrBussiness = new ScreenBLL();
            string message = "";

            //Check account for money to withdraw
            if (this.CheckCheckingAccount(checkAccount, amount))
            {
                //Check dispense
                if (this.DispenseMoney(amount))
                {
                    //Check withdraw
                    if (_cardDao.Withdraw(amount, checkAccount))
                    {
                        if (isPrintRecept)
                        {
                            ReceptPrintBussiness.PrintRecept(checkAccount, amount);
                        }

                        return true;
                    }
                    else
                    {
                        message = "Error during connect to database server!!";
                        scrBussiness.DisplayMessage(message);

                        return false;
                    }
                }
                else 
                {
                    message = "ATM doesn't enough money to withdraw";
                    scrBussiness.DisplayMessage(message);

                    return false;
                }
            }
            else 
            {
                message = "Account is not valid to withdraw!!";
                scrBussiness.DisplayMessage(message);

                return false;
            }
        }

        #endregion

        #region ThinhDV
        public bool Validate(string cardID)
        {
            bool result = false;
            //if (CardBLL.Install.ValidateCard(cardID) == (int)StatusCard.PermanentlyLock)
            //{
            //    SwallowCard();
            //    return result;
            //}
            //if (CardBLL.Install.ValidateCard(cardID) == (int)StatusCard.TemporaryLock)
            //{
            //    //announce
            //    result = false;
            //    return result;
            //}
            //if (CardBLL.Install.ValidateCard(cardID) == (int)StatusCard.Expired)
            //{
            //    //announce
            //    result = false;
            //    return result;
            //}
            //if (CardBLL.Install.ValidateCard(cardID) == (int)StatusCard.Nomal)
            //{
            //    // input PIN code
            //    result = true;
            //    return result;
            //}
            return result;

        }

        public int ChangePIN(string cardID, string newPIN)
        {
            return CardBLL.Install.ChangePIN(cardID, newPIN);
        }
        public void SwallowCard()
        {

            //swallow card

        }
        #endregion
    }
}
